/**
 * 将原先根目录下axios.ts文件copy过来， 把它提申为发送请求核心模块
*/

import { AxiosRequestConfig, AxiosPromise, AxiosResponse } from '../types/index';
import xhr from './xhr';
import { buildURL } from '../helpers/url';
import { transformRequest, transformResponse } from '../helpers/data';
import { processHeaders } from '../helpers/headers';

function dispatchRequest(config: AxiosRequestConfig): AxiosPromise {
    processConfig(config)
   return xhr(config).then(res => {
     return transformResponseData(res)
   })
}

function processConfig(config: AxiosRequestConfig): void {
  config.url = transformURL(config)
  // 需要先处理headers，因为transformRequestData中将data转成字符串
  config.headers = transformHeaders(config);
  config.data = transformRequestData(config)
}

// 处理params
function transformURL(config: AxiosRequestConfig): string {
  const { url, params } = config;
  // 因为AxiosRequestConfig变为可选属性，此时url可能为undefined
  // 解决方法：url! 感叹号断言： url! 从 url 的类型里去除了 null 和 undefined
//   http://www.zyiz.net/tech/detail-108494.html
  return buildURL(url!, params)
}

// 处理data参数
function transformRequestData(config: AxiosRequestConfig): any {
  return transformRequest(config.data)
}

// 处理headers
function transformHeaders(config: AxiosRequestConfig):void {
  const { data, headers = {} } = config
  return processHeaders(headers, data);
}

// 对应响应数据是json字符串： 则转成json对象
// 当请求接口 不设置`responseType`时，会返回json字符串
function transformResponseData(res: AxiosResponse): AxiosResponse {
  res.data = transformResponse(res.data)
  return res
}
export default dispatchRequest